<%@ page import="weaver.general.*" %>
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%--
 Created on 2019-12-18
 Copyright (c) 2001-2019 泛微软件
 泛微协同商务系统，版权所有。
 功能 加班申请流程
--%>
<script type="text/javascript">
    jQuery(document).ready(function () {
        if (!(WfForm.getBaseInfo().nodeid == 336)) return; //判断节点id
        window.checkCustomize = function () {
            var hs = WfForm.getDetailAllRowIndexStr("detail_1");
            var hss = hs.split(",");
            //设置标题
            var hj = 0.0;
            var jsgz = 0.0;
            var tx = 0.0;
            for (var i = 0; i < hss.length; i++) {
                var jxlx = WfForm.getFieldValue("field7847_" + hss[i]);
                var sc = WfForm.getFieldValue("field7852_" + hss[i]) * 1.0;
                hj += sc;
                if (jxlx == '0') {
                    tx += sc;
                }
                if (jxlx == '1') {
                    jsgz += sc;
                }
            }
            var bt = '加班申请-' + WfForm.getBrowserShowName("field7832") + "(" + WfForm.getFieldValue("field7839") + ")-合计:【" + hj + "】";
            if (jsgz != 0) {
                bt += "|结算工资:【" + jsgz + "】";
            }
            if (tx != 0) {
                bt += "|调休:【" + tx + "】";
            }
            // console.log(bt)
            WfForm.changeFieldValue("field-1", {value: bt})

            if (!pdcf()) {
                return false;
            }
            for (var i = 0; i < hss.length; i++) {
                var b1 = Mjxz(hss[i]);// 发起加班申请时，判断加班人员是否为M职级，条件满足人员不允许在线发起；
                // console.log("0", b1);
                if (!b1) {
                    return false;
                }
                b1 = Bzxz1(hss[i]);

                //   console.log("2", b1);
                if (!b1) {
                    return false;//发起加班申请时，判断加班人员是否有班组信息，如无对应班组数据时提示：“没有维护班组，请联系文员维护班组”
                }
                b1 = bzxz(hss[i]);
                //    console.log("3", b1);
                if (!b1) {
                    return false;// 正常上班时间，不允许申请加班，Normal（8：0~17：:00:） , D班（7:00~19:00）、N班（当天19至 第二天的7点）
                }
                b1 = cfyz1(hss[i]);

                //   console.log("4", b1);
                if (!b1) {
                    return false;
                }
                b1 = sfdxj(hss[i]);

                // console.log("5", b1);
                if (!b1) {
                    return false;
                }
                b1 = cfyz(hss[i]);

                //    console.log("6", b1);
                if (!b1) {
                    return false;
                }

            }

            setMx2ed();//算出明细2中的对应的额度
            var hs2 = WfForm.getDetailAllRowIndexStr("detail_2");
            var hss2 = hs2.split(",");
            for (var n = 0; n < hss2.length; n++) {
                var jbr = WfForm.getBrowserShowName("field7876_" + hss2[n]);//加班人
                var dqsc = WfForm.getFieldValue("field12257_" + hss2[n]);//当前额度
                var sy = WfForm.getFieldValue("field7879_" + hss2[n]) * 1.00 - WfForm.getFieldValue("field7880_" + hss2[n]) * 1.00 -
                    WfForm.getFieldValue("field7881_" + hss2[n]) * 1.00;//剩余

                if (jxlx == 1) {
                    var jxlx = WfForm.getFieldValue("field7847_" + hss[i]);
                    if (dqsc * 1.00 > sy * 1.00) {
                        alert(jbr + "本考勤周期“结算工资”类型加班小时数已经超过基准！本次可申请小时数：【" + sy + "】。如工作必需，请在额外加班小时数申请中发起审批！");
                        return false;
                    }
                }
            }

            // 额度比较

            return true;
        }

    });

    //明细1算出加班时长后按分类塞到明细2里用于额度验证
    function setMx2ed() {

        //循环明细1
        var hs = WfForm.getDetailAllRowIndexStr("detail_1");
        var hss = hs.split(",");
        var hs2 = WfForm.getDetailAllRowIndexStr("detail_2");
        var hss2 = hs2.split(",");
        //初始化 归零
        for (var m = 0; m < hss2.length; m++) {
            WfForm.changeFieldValue("field12257_" + hss2[m], {value: "0"});
        }
        for (var i = 0; i < hss.length; i++) {
            var kqzqid = WfForm.getFieldValue("field9510_" + hss[i]);//考勤周期id
            var gh = WfForm.getFieldValue("field9162_" + hss[i]);//加班人工号
            var jbsc = WfForm.getFieldValue("field7852_" + hss[i]);//加班时长
            var kx = WfForm.getFieldValue("field7847_" + hss[i]);//类型 0 调休 1 结算工资

            //结算工资类型 才计算
            if (kx == '1') {
                for (var j = 0; j < hss2.length; j++) {
                    var kqzqid2 = WfForm.getFieldValue("field9513_" + hss2[j]);//考勤周期id
                    var gh2 = WfForm.getFieldValue("field9516_" + hss2[j]);//加班人工号
                    var dqsc = WfForm.getFieldValue("field12257_" + hss2[j]);//当前额度

                    if (kqzqid == kqzqid2 && gh == gh2) {
                        var sc = jbsc * 1.00 + dqsc * 1.00;
                        WfForm.changeFieldValue("field12257_" + hss2[j], {value: sc});
                    }
                }
            }
        }
    }

    //不允许明细行重复  以及加班信息重复
    function pdcf() {
        var hs = WfForm.getDetailAllRowIndexStr("detail_1");
        var hss = hs.split(",");
        for (var j = 0; j < hss.length; j++) {
            var rowIndex = hss[j];
            var zd1 = WfForm.getFieldValue("field7846_" + rowIndex);//field7866_0
            var zd2 = WfForm.getFieldValue("field7847_" + rowIndex);
            var zd3 = WfForm.getFieldValue("field7848_" + rowIndex);
            var zd4 = WfForm.getFieldValue("field7849_" + rowIndex);
            var zd5 = WfForm.getSelectShowName("field9174_" + rowIndex);//开始时间
            var zd6 = WfForm.getSelectShowName("field9175_" + rowIndex);//结束时间
            console.log("zd1=", zd1);
            console.log("zd2=", zd2);
            console.log("zd3=", zd3);
            console.log("zd4=", zd4);
            console.log("zd5=", zd5);
            console.log("zd6=", zd6);
            if (zd1 != '' && zd2 != '' && zd3 != '' && zd5 != '') {
                for (var i = 0; i < hss.length; i++) {
                    if (i == j) continue;
                    var index = hss[i];
                    var z1 = WfForm.getFieldValue("field7846_" + index);//field7866_0
                    var z2 = WfForm.getFieldValue("field7847_" + index);
                    var z3 = WfForm.getFieldValue("field7848_" + index);
                    var z4 = WfForm.getFieldValue("field7849_" + index);
                    // var z4 = "";
                    var z5 = WfForm.getSelectShowName("field9174_" + index);
                    var z6 = WfForm.getSelectShowName("field9175_" + index);
                    if (zd1 == z1 && zd2 == z2 && zd3 == z3 && zd5 == z5 && zd6 == z6) {
                        alert("加班信息重复，请检查");
                        return false;
                    }
                    if (z3 == zd3 && zd1 == z1) {
                        //都为非跨天的情况 或  都为跨天
                        if ((zd4 == '' || zd4 == 0) && (z4 == '' || z4 == 0)) {
                            if ((zd5 > z5 && zd5 < z6) ||
                                (zd6 > z5 && zd6 < z6) ||
                                (zd5 < z5 && zd6 > z6) || zd5 == z5 || zd6 == z6 || ((zd5 == z5 && zd6 == z6))) {
                                alert("明细行中加班时间有重复，请检查");
                                return false;
                            }
                        }
                        if ((zd4 == 1) && (z4 == 1)) {
                            if ((zd5 > z5 && zd5 < z6) || (zd6 > z5 && zd6 < z6)
                                || (zd5 < z5 && zd6 > z6) || zd5 == z5 || zd6 == z6 || (zd5 == z5 && zd6 == z6)) {
                                alert("明细行中加班时间有重复，请检查");
                                return false;
                            }
                        }
                        //比较的一行 为非跨天
                        if (zd4 == 1 && (z4 == '' || z4 == 0)) {
                            if ((zd5 < z6)) {
                                alert("明细行中加班时间有重复，请检查");
                                return false;
                            }
                        }
                        //被比较的一行 为非跨天
                        if (z4 == 1 && (zd4 == '' || zd4 == 0)) {
                            if ((z5 < zd6)) {
                                alert("明细行中加班时间有重复，请检查");
                                return false;
                            }
                        }
                    }
                }
            }
        }
        return true;
    }

    // 发起加班申请时，判断加班人员是否为M职级，条件满足人员不允许在线发起；
    function Mjxz(id) {
        if (WfForm.getFieldValue("field9111_" + id).startsWith("M")) {
            alert1("M职级不允许在线发起加班申请", "field7846_" + id);
            return false;
        }
        return true;
    }

    //发起加班申请时，判断加班人员是否有班组信息，如无对应班组数据时提示：“没有维护班组，请联系文员维护班组”
    function Bzxz1(id) {
        var name = WfForm.getBrowserShowName("field7846_" + id)
        if ((WfForm.getFieldValue("field9160_" + id) == '') && (WfForm.getFieldValue("field9161_" + id) == '') && WfForm.getFieldValue("field7846_" + id) != '') {
            alert(name + "没有维护班次，请联系文员维护班次");
            return false;
        }

        if ((WfForm.getFieldValue("field9160_" + id) != '') && (WfForm.getFieldValue("field9161_" + id) == '') && WfForm.getFieldValue("field7846_" + id) != '') {
            alert(name + "当前选择的日期第二天没有维护班次，请联系文员维护班次");
            return false;
        }

        return true;
    }

    function bzxz(id) {
        var kssj = changeTime(WfForm.getFieldValue("field7850_" + id));
        var jssj = changeTime(WfForm.getFieldValue("field7851_" + id));
        var bz1 = WfForm.getFieldValue("field9160_" + id);//当天班次

        var bz2 = WfForm.getFieldValue("field9161_" + id);//第二天班次

        var bz3 = WfForm.getFieldValue("field13018_" + id);//前一天班次 正式系统待添加

        var kt = WfForm.getFieldValue("field7849_" + id);//跨天

        if (bz1 == '' || bz2 == '') return false;
        if (kt != 1) {
            if (bz1 == 'Normal') {
                return ts('08:00', '17:00', id)
            }else if (bz1 == 'D') {
                return ts('07:00', '19:00', id)
            }
            //前一天班次为N 当天不能选0~7
            if(bz3=='N'){
                return ts('00:00', '07:00', id);
            }
            //如果当天为N 不能选19-24
            if(bz1=='N'){
                return ts('19:00', '24:00', id);
            }
        }////非跨天
        else {
            if (bz1 == "N") {
                return dialog(id);
            } else {
                if (kssj == '') {
                    kssj = '24:00';
                }
                if (jssj == '') {
                    jssj = '00:00';
                }
                if (bz1 == 'Normal') {
                    if (kssj < '17:00') {
                        return dialog(id);
                    } else {
                        if (bz2 == "Normal") {
                            if (jssj > '08:00') {
                                return dialog(id);
                            }
                        } else if (bz2 == "D") {
                            if (jssj > '07:00') {
                                return dialog(id);

                            }
                        } else if (bz2 == 'N') {
                            if (jssj > '19:00') {
                                return dialog(id);

                            }
                        }
                    }
                } else if (bz1 == 'D') {
                    if (kssj < '19:00') {
                        return dialog(id)
                    } else {
                        if (bz2 == "Normal") {
                            if (jssj > '08:00') {
                                return dialog(id);
                            }
                        } else if (bz2 == "D") {
                            if (jssj > '07:00') {
                                return dialog(id);
                            }
                        } else if (bz2 == 'N') {
                            if (jssj > '19:00') {
                                return dialog(id);
                            }
                        }
                    }

                }

                if (bz2 == "Normal") {
                    if (jssj > '08:00') {
                        return dialog(id);
                    }
                } else if (bz2 == "D") {
                    if (jssj > '07:00') {
                        return dialog(id);
                    }
                } else if (bz2 == 'N') {
                    if (jssj > '19:00') {
                        return dialog(id);
                    }
                }
            }
        }//跨天
        return true;
    }

    // 7. （班组为非Rest）平日（工作日）加班最小加班时间单位为30分钟起，小于30分钟不允许发起；
    // （班组为Rest）休日节日加班时间为2小时起，小于2小时不允许发起，特殊日期休日不受此限制，提供特殊日期维护入口。
    function cfyz1(id) {
        var tsrq = WfForm.getFieldValue("field9136_" + id);//是否为特殊日期
        var bz = WfForm.getFieldValue("field9160_" + id);//当天班次
        var bz1 = WfForm.getFieldValue("field9161_" + id);//第二天班次、
        var bz3 = WfForm.getFieldValue("field13018_" + id);//前一天班次
        var banz = WfForm.getFieldValue("field9113_" + id);//班组
        var rq = WfForm.getFieldValue("field7848_" + id);//日期
        var kt = WfForm.getFieldValue("field7849_" + id);//跨天
        var sc = WfForm.getFieldValue("field7852_" + id) * 1.00;//时长
        var kssj = changeTime(WfForm.getFieldValue("field7850_" + id));//开始时间
        var jssj = changeTime(WfForm.getFieldValue("field7851_" + id));//结束时间
        var kssjxlk = WfForm.getFieldValue("field9174_" + id);//开始时间下拉框
        var jssjxlk = WfForm.getFieldValue("field9175_" + id);//结束时间下拉框
        var jbr = WfForm.getFieldValue("field7846_" + id);
        var isysjb = WfForm.getFieldValue("field12929_" + id);//是否延时加班

        if (tsrq == '' && rq != '' && jssjxlk != '' && kssjxlk != '') {


            //当前加班的单子 如果周末某天已经有2小时加班，再申请小于2小时的加班（不一定是同一天）要能提交
            if (bz == 'REST' && sc < 2) {
                //前一天为N班，且为延时加班，可以提交
                if(bz3=='N' && isysjb == '1'){
                    return true;
                }else{
                    //如果是时长小于2的 且是REST的情况  循环遍历当前明细 看是否有其他REST大于2  如果有 不走下面逻辑 可以提交
                    var hs = WfForm.getDetailAllRowIndexStr("detail_1");
                    var hss = hs.split(",");
                    var sc3 = sc;
                    for (var i = 0; i < hss.length; i++) {
                        var index = hss[i];
                        if (index != id) {
                            // alert(1111);
                            var bz11 = WfForm.getFieldValue("field9160_" + index);//当天班次
                            var jbr1 = WfForm.getFieldValue("field7846_" + index);
                            var sc1 = WfForm.getFieldValue("field7852_" + index) * 1.00;//时长
                            // //同一个人 且为REST 找时长
                            if (bz11 == 'REST' && jbr1 == jbr) {
                                // alert(111);
                                if (sc1 >= 2) {
                                    return true;
                                } else {
                                    sc3 += sc1;
                                }
                            }
                        }
                    }
                    if (sc3 >= 2) {
                        return true;
                    }
                }
            }

            if (kt == '0' || kt == '') {
                //  alert(sc);
                if (bz != 'REST' && sc < 0.5) {
                    alert2("（班次为非Rest）平日（工作日）加班最小加班时间单位为30分钟起，小于30分钟不允许发起", "field9174_" + id, "field9175_" + id);
                    return false;
                }
                if (bz == 'REST' && sc < 2) {
                    alert2("（班次为Rest）休日节日加班时间为2小时起，小于2小时不允许发起", "field9174_" + id, "field9175_" + id);
                    return false;
                }
            }
            //跨天
            else {
                //休日连平日（跨天），参考休日加班逻辑（大于等于2小时就能提交） 如果第一天为REST  第二天不为REST  如果起始时间大于22:00 不可以提交
                if ((bz1 != 'REST' && bz == 'REST') || (bz1 == 'REST' && bz == 'REST')) {

                    if (sc < 2) {
                        alert("休日加班时间不能小于2小时");
                        return false;
                    }
                }
            }

        }
        return true;
    }

    //11. 三个考勤（当前周期，当前的前一个，当前的前一个的前一个）周期（月度考勤周期为每月18号到下月17号
    //）调休假（OA_OvertimeDaysOff）为负的，只能发起调休类的加班，法定节假日除外；
    function sfdxj(id1) {
        var sfwjjr = WfForm.getFieldValue("field9509_" + id1);//是否为节假日
        if (sfwjjr == '0') return true;
        // console.log("WfForm.bindFieldChangeEvent--", obj1, id1, value1);
        var txjed = WfForm.getFieldValue("field9514_" + id1) * 1.00;//调休假额度
        var qjlx = WfForm.getFieldValue("field7847_" + id1);//
        if (txjed < 0) {
            if (qjlx == "1") {
                alert1("调休假为负,只能发起调休类的加班", "field7847_" + id1);
                return false;
            }
        }
        return true;
    }

    //5. 加班数据不允许重复发起，不允许重复和重合，提交时验证加班时间的重复重合性；
    function cfyz(id) {
        if (WfForm.getFieldValue("field7846_" + id) != '' && WfForm.getFieldValue("field9175_" + id) != ''
            && WfForm.getFieldValue("field9174_" + id) != '' && WfForm.getFieldValue("field9127_" + id) != '') {
            alert2("加班数据不允许重复发起，不允许重复和重合", "field9174_" + id, "field9175_" + id);
            return false;
        }
        return true;
    }

    function ts(xzkssj, xzjssj, id) {
        var wb = "正常上班时间，不允许申请加班，Normal（7:50~16:50） , D班（6:50~18:50）、N班（当天18:50至 第二天的6:50点）";
        // 正常上班时间，不允许申请加班，Normal（8：0~17：:00:） , D班（7:00~19:00）、N班（当天19至 第二天的7点）；
        var kssj = changeTime(WfForm.getFieldValue("field7850_" + id));
        var jssj = changeTime(WfForm.getFieldValue("field7851_" + id));
        var bz1 = WfForm.getFieldValue("field9160_" + id);//当天班次
        var bz2 = WfForm.getFieldValue("field9161_" + id);//第二天班次
        var kt = WfForm.getFieldValue("field7849_" + id);//跨天

        var flag = true;
        if (bz1 != '' && bz2 != '') {
            if (kssj == '') {
                kssj = '24:00';
            }
            if (jssj == '') {
                jssj = '00:00';
            }
            if ((xzkssj < kssj && xzjssj > kssj) || (xzkssj < jssj && xzjssj > jssj)) {

                alert(wb);
                flag = false;
            } else if ((xzkssj > kssj && xzjssj < jssj)) {

                alert(wb);
                flag = false;
            }
            //开始时间 结束时间与上班时间重合时判断
            if (xzkssj == kssj && xzjssj == jssj) {
                alert(wb);
                flag = false;
            }
        }
        return flag;
    }
    //时间转换
    function changeTime(sj) {
        if (sj != '') {
            if (!(sj.split(':')[1] == "40" || sj.split(':')[1] == "10" || sj.split(':')[1] == "50" || sj.split(':')[1] == "20")) {
                return sj;
            } else if (sj.split(':')[1] == "40" || sj.split(':')[1] == "10") {
                //提前20分钟后的时间 补上原来的20分钟 再返回
                var s = '1999-01-01 ' + sj;
                s = s.replace(/-/g, "/");
                var date = new Date(s);
                date.setMinutes(date.getMinutes() + 20);
                return dateFormat('HH:MM', date);
            } else if (sj.split(':')[1] == "50" || sj.split(':')[1] == "20") {
                //提前20分钟后的时间 补上原来的10分钟 再返回
                var s = '1999-01-01 ' + sj;
                s = s.replace(/-/g, "/");
                var date = new Date(s);
                date.setMinutes(date.getMinutes() + 10);
                return dateFormat('HH:MM', date);
            }
        } else {
            return '';
        }
    }

    //时间格式化
    function dateFormat(fmt, date) {
        let ret;
        const opt = {
            "Y+": date.getFullYear().toString(),        // 年
            "m+": (date.getMonth() + 1).toString(),     // 月
            "d+": date.getDate().toString(),            // 日
            "H+": date.getHours().toString(),           // 时
            "M+": date.getMinutes().toString(),         // 分
            "S+": date.getSeconds().toString()          // 秒
            // 有其他格式化字符需求可以继续添加，必须转化成字符串
        };
        for (let k in opt) {
            ret = new RegExp("(" + k + ")").exec(fmt);
            if (ret) {
                fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
            };
        };
        return fmt;
    }

    //日期加减
    function addDate(date, days) {
        if (days == undefined || days == '') {
            days = 1;
        }
        var date = new Date(date);
        date.setDate(date.getDate() + days);
        var month = date.getMonth() + 1;
        var day = date.getDate();
        return date.getFullYear() + '-' + getFormatDate(month) + '-' + getFormatDate(day);
    }

    // 日期月份/天的显示，如果是1位数，则在前面加上'0'
    function getFormatDate(arg) {
        if (arg == undefined || arg == '') {
            return '';
        }

        var re = arg + '';
        if (re.length < 2) {
            re = '0' + re;
        }

        return re;
    }
    function dialog(id) {
        alert(wb);
        return false;
    }
    //弹窗改造
    function alert1(text, fid) {
        alert(text);

    }
    function alert2(text, fid1, fid2) {
        alert(text);

    }
</script>
